这场没打,补题记录
D
直接标记 %$3$ 的余数,对每个位置进行 $check$ 即可,注意处理 $0$
E1
题意
给两个数 $n,m$ 和 $1$~$n$ 的乱序序列,问有多少个序列的中位数为 $m$ (偶数个数的区间为区间中间左边的数)
题解
双指针从 $m$ 的位置向两边扫,$check$ 大于 $m$ 和小于 $m$ 的数的数量即可
E2
题意
给两个数 $n,m$ 和一个任意序列,问有多少个序列的中位数为 $m$ (偶数个数的区间为区间中间左边的数)
分析
因为可能存在多个m,不能像E1一样可以直接从m的位置两边直接找,直接找到区间为m的数量时间复杂度为n^2,显然不可取
Magic idea: 给一个序列,计算个序列的中位数大于等于 k 的区间个数,这个可以枚举每个位置,设前缀和为sum[],位置i的前缀和为 $sum_i$, 显然我们想统计 $sum_i-sum_j>=1(j<i)$(这个根据把>=m看做+1, < m看做-1,使得中位数为k,可以容易得到)的所有为位置,这个显然可以通过权值线段树维护区间和可以 $log$ 得到。
所有我们可以设 $f(k)$ : 区间中位数 >=m 的个数
答案则是:$f(k)-f(k+1)$
同理我们可以设 $f(k)$ : 区间中位数 <=m 的个数,那么需要统计的区间为 $sum_i-sum_j<=0(j<i)$
答案则是:$f(k)-f(k-1)$
F
题意
yige